class Solution {
    public int findMaxLength(int[] nums) {
        /**
        前缀和+hash表，或许可以，之前做过一个题，nums连续数组和为k 将0变成-1.那么就可以将题目改写为：找到最长子数组，其和为0； 例如： nums[j...i] 满足那么：pre[i]-pre[j-1]=0; 我们假设：nums = {-1,1,1,-1,1,1,-1,1,-1},其中-1都是由0转换过来的。 那么前缀和为 pre = {0,-1,0,1,0,1,2,1,2,1} 那么pre的两个相同元素之间，满足pre[i]-pre[j-1]=0。
        结果：找到最长距离相同的元素，即第一个1出现的位置和最后一个1出现的位置。两者下标差就是答案。
         */
        int l = nums.length;
        int[] sum = new int[l + 1];
        for(int i = 0;i < l;i++) {
            if(nums[i] == 0) {
                nums[i] = -1;
            }
        }
        //形成前缀
        for(int i = 1;i <= l;i++) {
            sum[i] = sum[i - 1] + nums[i - 1];
        }
        int ret = 0;
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i < sum.length;i++) {
            int key = sum[i];
            //只存入0,1第一次出现的位置
            if(!map.containsKey(key)) {
                map.put(key,i);
            } else {
                ret = Math.max(ret,i - map.get(key));
            }
        }
        return ret;
    }
}